Git - Local
learningitbrasnching 튜토리얼을 해보면서 그동안 한번씩 겪었던 문제들을 해결하는 방법과 기타 세세한 사용방법까지 알게되어 정리하는 글입니다. 한번 꼭 해보세요. git에 관련된 최고의 튜토리얼이였습니다.
이전 포스트:
Git 개념
0. HEAD
HEAD는 현재 내가 작업하고 있는 위치를 가리킨다.
여기서 '커밋'이 아닌 '위치'라고 표현한 이유는 HEAD가 참조하는 것이 커밋일수도 있지만, 브랜치일 수도 있기 때문이다. 만약 HEAD가 커밋을 참조하게되면 'HEAD -> 커밋'이지만 브랜치를 참조하게되면 'HEAD -> 브랜치 -> 브랜치의 최신 커밋'으로 참조에 참조를 하게 된다. (이 때문에 checkout 명령어에서 절대참조와 상대참조 개념이 생겨날 수 있다.)
Local에서 HEAD의 Default 위치는 현재 작업 브랜치이다.
깃의 Local에서 사용되는 명령어를 보도록 하자.
1. commit
- 명령어:
git commit
Delta값을 저장하고 포인트 지점으로 만든다.
1-1. 커밋 내역 수정
- 명령어:
git commit --amend
현재의 커밋 내역을 수정한다. (덮어쓴다고 보면 될 것 같다.)
2. branch
- 명령어:
git branch <브랜치명>
새로운 브랜치를 생성한다.
2-1. 브랜치 이동
- 명령어:
git branch -f <옮기고 싶은 브랜치명> <이동될 위치>
local이라는 브랜치를 main브랜치가 위치한 커밋지점으로 이동시키고 싶으면git branch -f local main
이라고 하면 된다. 이 때 local이 그동안 가지고 있었던 커밋들은 따라서 이동하지 않고 local이 참조할 커밋 집합이 달라지게 된다고 생각하면 된다.
3. checkout
이 명령어는 겉보기에 여러 의미를 가진 명령어로 보인다. 하지만 단 하나의 의미를 가지는데, 현재 HEAD가 가리키는 지점을 이동시키는 명령어라고 생각하면 된다.
3-1. 절대 참조
- 명령어:
git checkout <위치하고 싶은 브랜치 or 커밋>
git checkout <브랜치명>
을 하면 HEAD가 해당 브랜치의 최신 커밋에 위치하게되는 것일 뿐이다.
3-2. 상대 참조
- 명령어:
git checkout <참조할 커밋명 or 브랜치명 or HEAD> [^ or ~(숫자)]
예를 들어git checkout HEAD^^
라고 하면 현재 HEAD가 있는 위치에서 2번 전의 커밋으로 HEAD가 이동한다.git checkout main~2
라고 하면 main 브랜치의 최신 커밋에서 2번 전의 커밋으로 HEAD가 이동한다.
4. merge
- 명령어:
git merge <내 브랜치에 합치고 싶은 브랜치명>
어떤 브랜치의 commit 집합들을 내 브랜치의 커밋 집합에 포함시키는 것이다. 이 때 '어떤' 브랜치는 그대로 살려둔다.
5. rebase
- 명령어:
git rebase <내 브랜치가 이사가는 브랜치>
내 브랜치의 커밋집합들을 다른 브랜치로 이동시키는 것이다. 이 때 이동되는 커밋들은 이사갈 브랜치와 갈라져나온 시점부터의 모든 커밋이다.
+ 여기서 주의할 점은 커밋을 이사시킬 때 브랜치 라벨은 이동하는 것이지만 커밋들은 복사되는 것이고, 원본 커밋은 브랜치가 없는 커밋으로 남아있게된다.
6. reset / revert
6-1. reset
- 명령어:
git reset <reset한 후 도착할 위치>
git reset HEAD^
,git reset test-branch
,git reset commit32435h22G
와 같이 위치를 가리키는 것은 HEAD, 브랜치명, 커밋명등 다양하고 상대참조와 절대참조 모두 할 수 있다.
리셋은 리셋되는 커밋들을 없었던 커밋처럼 삭제해버린다.
6-2. revert
- 명령어:
git revert <revert할 커밋을 가리키는 참조>
revert는 그 커밋의 내역을 정확히 반대로 하는 새로운 커밋을 만들어준다. (한 커밋이 코드를 추가하는 내용의 delta를 가지고 있었다면 revert로 생성된 커밋은 그 코드를 삭제하는 delta를 가지고 있다.)
7. cherry-pick
- 명령어:
git cherry-pick <가져오고싶은 커밋들>
cherry-pick은 커밋들(1개 이상)을 개별적으로 복사해서 현재의 브랜치에 추가해준다. 이 때 나열하는 순서에 따라 커밋들을 추가하기 때문에 순서를 고려해야 할 수도 있다.
8. tag
- 명령어:
git tag <태그명> (<커밋명>)
해당 커밋에 태그를 추가한다. 추후 체크아웃이나 체리픽, describe등의 포인트가 된다.
커밋명은 생략할 수도 있는데, 생략하게 되면 Default인 HEAD 지점의 커밋을 가리키게 된다.
9. describe
- 명령어:
git describe <커밋을 가리키는 참조>
- 결과값:
<tag>_<numCommits>_g<hash>
tag
는 가장 가까운 부모 태그를 나타냅니다.numCommits
은 그 태그가 몇 커밋 멀리있는지를 나타냅니다.<hash>
는 묘사하고있는 커밋의 해시를 나타냅니다.
- mixed5 - Git describe, learningitbranching